#!/bin/bash

# NextGen node/javascript top-level bindings test/s  - there are a few stages of test here..

# 1. ensure we've got the dependancies pre-built, such as js bindings, C bindings, and minimal compiled c targets.
# 2. run the static pre-canned JS create/pack tests in the 'mavlink.tests.js' files (ie assembling packets for sending)
# 3. capture all the packets that the C bindings test suite make, and try to parse them all with JS. ( incoming packet parsing)
# 4. make and run the complete autogenerated 'mocha' test suite/s that does byte-level verification of JS against the C bindings.

# We use '.tests.js' autogenerated javascript to build/pack one of each packet with test data for nominally sending

# utilise the C bindings and test suite to generate a bunch of mavlink data that we can run through the node/javascript parser
# we do this by executing ./generator/C/test/posix/testmav2.0_ardupilotmega to 
# run mavlink_test_all() from generator/C/include_v2.0/ardupilotmega/testsuite.h

# this script can be called manually by a human, or it can be triggered by a 'npm test' from the generator/javascript/ folder, so we handle either.

set -e
#set -x
RED='\033[1;31m'
GRN='\033[1;31m'
NC='\033[0m' # No Color

# 0 means low; 1 means some; 2 means high verbosity
VERBOSITY='0'
OUT0="/dev/stdout"
OUT1="/dev/null"
OUT2="/dev/null"

if [ "$VERBOSITY" = "1" ]; then
OUT1="/dev/stdout"
fi
if [ "$VERBOSITY" = "2" ]; then
OUT1="/dev/stdout"
OUT2="/dev/stdout"
fi


test -z "$MDEF" && MDEF="../message_definitions"

# delete the pretests file if more than 1 minute old, this prevents the 'npm test' call near the end having to re-do the pretests
if [ "`find pretests.done.swp -mmin +5 2>/dev/null`" ]; then
 rm pretests.done.swp
fi

if [[ ! -f "pretests.done.swp" ]]; then

    # build js bindings we want to test
    printf "${RED}Generating JS-NextGen bindings to test...${NC}\n\n"
    sleep 1
    cd generator
    ./gen_js.sh > $OUT2
    cd ..


    # build C bindings to test the testsuite.js 'recieve' tester against.
    #    we quieten them as we really aren't testing THEM here.
    printf "${RED}Generating C bindings to test JS-NextGen against...${NC}\n\n"
    sleep 1
    ./tools/mavgen.py --lang C $MDEF/v1.0/ardupilotmega.xml -o generator/C/include_v1.0 --wire-protocol=1.0 > $OUT2
    ./tools/mavgen.py --lang C $MDEF/v1.0/ardupilotmega.xml -o generator/C/include_v2.0 --wire-protocol=2.0 > $OUT2


    #   we quieten them as we really aren't testing THEM here.
    printf "${RED}Compiling C bindings to test JS-NextGen against...${NC}\n\n"
    sleep 1
    pushd generator/C/test/posix  > $OUT2
    make clean testmav1.0_ardupilotmega testmav2.0_ardupilotmega testmav1.0_common testmav2.0_common > $OUT2
    popd  > $OUT2

     # need to install the bindings first to test them?
    printf "${RED}Installing just-generated npm package...${NC}\n\n"
    cd generator/javascript
    npm install 2>/dev/null > /dev/null
    cd ../..

   printf "${RED}JS-NextGen PRETEST setup done.${NC}\n\n"
    touch pretests.done.swp


else

    printf "${RED}JS-NextGen PRETEST setup already recently done, skipping.${NC}\n\n"

fi

# 'npm test' sets this env var , so this stops it becoming a recursive call.
if [[ ! -z "${npm_package_scripts_pretest}" ]]; then
# stop here if we are in pre-test
exit 0
fi

# run the automatically generated tool for build/pack, ie create and pack one of everything, no byte-level checking of the packed results tho, comes later.
printf "${RED}Running non-NPM JS-NextGen create/pack tests ...${NC}\n\n"
sleep 1
node generator/javascript/implementations/mavlink_ardupilotmega_v2.0/mavlink.tests.js > $OUT1
node generator/javascript/implementations/mavlink_ardupilotmega_v1.0/mavlink.tests.js > $OUT1
node generator/javascript/implementations/mavlink_common_v2.0/mavlink.tests.js > $OUT1
node generator/javascript/implementations/mavlink_common_v1.0/mavlink.tests.js > $OUT1


# piping the wire-ready hex-output from the C bindings into the node bindings per-packet and recieve each of them.
printf "${RED}Streaming C test data into JS-NextGen for pushBuffer/parseBuffer tests${NC}\n\n"
sleep 1
pushd generator/C/test/posix  > $OUT2
./testmav1.0_ardupilotmega | grep '^fe' | node ../../../../examples/testparser.js ardupilotmega 1.0 $VERBOSITY 
./testmav2.0_ardupilotmega | grep '^fd' | node ../../../../examples/testparser.js ardupilotmega 2.0 $VERBOSITY 
./testmav1.0_common | grep '^fe' | node ../../../../examples/testparser.js common 1.0 $VERBOSITY
./testmav2.0_common | grep '^fd' | node ../../../../examples/testparser.js common 2.0 $VERBOSITY
popd  > $OUT2


# make big collection ~990 of mocha tests based on C output like the above but more thorough, this includes byte-level checking of the packed results
# run the ~990 or more mocha tests we just made:  
#( this uses generator/javascript/package.json -> runs make_tests.py -> outputs made_tests.js -> which are then executed by 'mocha test' )
printf "\n${RED}Running automated JS-NextGen NPM test suite...${NC}\n\n"
sleep 1
cd generator/javascript

npm test  2>/dev/null > $OUT0
cd ../..


printf "\n${RED}JS-NextGen Testing done.${NC}\n\n"
